/**
 * 小程序相关函数
 * @module wxFunc
 */
let wxFunc = {
    /**
     * @function
     * @name update
     * @description 更新小程序
     */
    update() {
        console.log('into update')
        const updateManager = wx.getUpdateManager()
        updateManager.onUpdateReady(function() {
            wx.showModal({
                title: '更新提示',
                content: '新版本已经准备好，是否重启应用？',
                success: function(res) {
                    if (res.confirm) {
                        // 新的版本已经下载好，调用 applyUpdate 应用新版本并重启
                        updateManager.applyUpdate()
                    }
                }
            })
        })
    },
    /**
     * @function
     * @name checkSetting
     * @description 检查用户授权状态，userinfo无效
     * @param  {object} argG 全局变量对象
     * @param  {string} argSet 要检查的权限
     */
    checkSetting(argG, argSet) {
        return new Promise(function(resolve, reject) {
            wx.getSetting({
                success(res) {
                    argG.authSetting = res.authSetting
                    if (!res.authSetting['scope.' + argSet]) {
                        wx.authorize({
                            scope: 'scope.' + argSet,
                            success(rs) {
                                return resolve(rs)
                            },
                            fail(err) {
                                return reject(err)
                            }
                        })
                    } else {
                        return resolve(res)
                    }
                },
                fail(err) {
                    return reject(err)
                }
            })
        })
    },
    /**
     * @function
     * @name getLocation
     * @description 获取地理位置
     * @param  {object} argG 全局变量
     * @param  {string} argType='wgs84' wgs84 返回 gps 坐标，gcj02 返回可用于 wx.openLocation 的坐标
     * @param  {} argAltitude=false 是否高精度
     */
    getLocation(argG, argType = 'wgs84', argAltitude = false) {
        let location = () => {
            return new Promise(function(resolve, reject) {
                wx.getLocation({
                    altitude: argAltitude,
                    type: argType,
                    success: function(res) {
                        console.log(res)
                        return resolve(res)
                    }
                })
            })
        }
        let re = async() => {
            try {
                // await this.checkSetting(argG, 'userLocation').catch(err => {
                //     // 不走外层catch
                //     console.log('单独的错误处理', err)
                // })
                await this.checkSetting(argG, 'userLocation')
                let re = await location()
                return Promise.resolve(re)
            } catch (err) {
                if (err.errMsg) {
                    this.toast('您已拒绝地理位置授权,可以在设置中重新打开')
                }
                return Promise.reject(err)
            }
        }
        return re()
    },
    /**
     * @function
     * @name scrollTop
     * @description 回到顶部
     * @param  {number} scrollTop=0 滚动参数
     * @param  {number} duration=0 消耗时间
     */
    scrollTop(scrollTop = 0, duration = 0) {
        wx.pageScrollTo({
            scrollTop: scrollTop,
            duration: duration
        })
    },
    /**
     * @function
     * @name toast
     * @description toast
     * @param  {string} argTitle 显示内容
     * @param  {object} argOption toast配置
     * @param {string} argOption.icon 图标
     * @param {string} argOption.image 自定义图标的本地路径，image 的优先级高于 icon
     * @param {number} argOption.duration number 1500 否 提示的延迟时间
     * @param {boolean} argOption.mask 是否显示透明蒙层，防止触摸穿透
     * @param {Function} argOption.success 接口调用成功的回调函数
     * @param {Function} argOption.fail 接口调用失败的回调函数
     * @param {Function} argOption.complete 接口调用结束的回调函数（调用成功、失败都会执行
     */
    toast(argTitle, argOption = { icon: 'none' }) {
        Object.assign(argOption, {
            title: argTitle
        })
        wx.showToast(argOption)
    },
    /**
     * @function
     * @name setTitle
     * @description 设置标题
     * @param  {string} argTitle 标题名称
     */
    setTitle(argTitle) {
        wx.setNavigationBarTitle({
            title: argTitle
        })
    },
    /**
     * @function
     * @name needLogin
     * @description 判断是否要登录 promise
     */
    needLogin() {
        return new Promise(function(resolve, reject) {
            let login = () => {
                return wx.login({
                    timeout: 5000,
                    success: function(rs) {
                        console.info('login info:', rs)
                        return resolve(rs)
                    },
                    fail: function(err) {
                        // 重新登录
                        return reject(err)
                    }
                })
            }
            wx.checkSession({
                timeout: 5000,
                success: rs => {
                    // 处理未有用户信息
                    if (!wx.getStorageSync('login')) {
                        return login()
                    } else {
                        return reject(rs)
                    }
                },
                fail: err => {
                    console.log(err)
                    return login()
                }
            })
        })
    },
    /**
     * @function
     * @description 登录
     * @name login
     */
    login() {
        // 重新登录
        return new Promise(function(resolve, reject) {
            wx.login({
                timeout: 5000,
                success: function(rs) {
                    // session_key 未过期，并且在本生命周期一直有效
                    console.info('login info:', rs)
                    return resolve(rs)
                },
                fail: function(err) {
                    // 重新登录
                    // session_key 已经失效，需要重新执行登录流程
                    console.log(err)
                    wx.login()
                    return reject(err)
                }
            })
        })
    },
    /**
     * @function
     * @description 当前页面数据
     * @name currentPage
     */
    currentPage() {
        var pages = getCurrentPages()
        return pages[pages.length - 1]
    },
    /**
     * @function
     * @description 获取当前页url
     * @name getCurrentPageUrl
     * @param  {boolean} argWithParams 是否附带参数
     */
    getCurrentPageUrl(argWithParams) {
        var pages = getCurrentPages()
        var currentPage = pages[pages.length - 1]
        var url = currentPage.route
        var options = currentPage.options
        if (argWithParams) {
            url += this.urlParams(options)
        }
        return url
    },
    /**
     * @function
     * @name toPage
     * @description 跳到页面,默认为后退
     * @param  {string} argPage='back' 页面名称
     * @param  {object} argParams={} 参数
     * @param  {string} argType 跳转类型 {@link https://developers.weixin.qq.com/miniprogram/dev/api/route/wx.redirectTo.html}
     */
    toPage(argPage = 'back', argParams = {}, argType) {
        if (argPage === 'back') {
            wx.navigateBack({
                delta: argType || 1
            })
            return
        }
        switch (argType) {
            case 'switchTab':
                wx.switchTab({
                    url: '/pages/' + argPage + '/main' + this.urlParams(argParams)
                })
                break
            case 'reload':
                wx.reLaunch({
                    url: '/pages/' + argPage + '/main' + this.urlParams(argParams)
                })
                break
            case 'redirectTo':
                wx.redirectTo({
                    url: '/pages/' + argPage + '/main' + this.urlParams(argParams)
                })
                break
            case 'reLaunch':
                wx.reLaunch({
                    url: '/pages/' + argPage + '/main' + this.urlParams(argParams)
                })
                break
            default:
                wx.navigateTo({
                    url: '/pages/' + argPage + '/main' + this.urlParams(argParams)
                })
                break
        }
    },
}
export default wxFunc